package com.xp.gather2.comment.utils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class StringUtil {
	/**
	 *  判断一个字符串是否为空
	 * @param str
	 * @return
	 */
	public static boolean IsNull(String str){
		if(str==null||"".equals(str)||"".equals(str.trim())){
			return true;
		}
		return false;
	}
	/**
	 *  判断一个字符串是否为非空
	 * @param str
	 * @return
	 */
	public static boolean IsNotNull(String str){
		if(str==null||"".equals(str)||"".equals(str.trim())){
			return false;
		}
		return true;
	}
	/**
	 * 转换成小写
	 *@author wangym
	 *@date Aug 15, 2012 9:16:41 AM
	 * @param src
	 * @return
	 */
	public static String tranStartCharToLower(String src)
	{
		if (src == null || src.equals(""))
		{

			return null;
		} else
		{
			char target = src.charAt(0);
			return src.replaceFirst((new StringBuilder(String.valueOf(target))).toString(), (new StringBuilder(String.valueOf(Character.toLowerCase(src.charAt(0))))).toString());
		}
	}
	/**
	 * 去掉字符串两端的空格
	 *@author wangym
	 *@date Aug 15, 2012 9:13:47 AM
	 * @param str
	 * @return
	 */
	public static String toTrim(String str)
	{
		if (str == null)
			return "";
		if (str.trim().equalsIgnoreCase("null"))
			return "";
		else
			return str.trim();
	}
	/**
	 * 获取项目路径
	 * @return
	 */
	public static String getWebRootPath(){
		String filePath=new StringUtil().getClass().getResource("/").getPath();
		if(filePath.indexOf("/")==0){
			filePath=filePath.substring(1, filePath.lastIndexOf("WEB-INF"));
		}else{
			filePath=filePath.substring(0, filePath.lastIndexOf("WEB-INF"));
		}
		return filePath;
	}

	public static void main(String[] args) {
		System.out.println(StringUtil.getWebRootPath());
	}

	/**
	 * 如果是null返回空字符串
	 * @return arg
	 */
	public static String SiftNull(String arg){
		String rt = "";
		if(arg != null && !"".equals(arg)){
			rt = arg;
		}
		return rt;
	}




	/**
	 *
	 * 对于字符类型的做空格、tab键和回车的处理
	 *
	 * @param： 参数1：str
	 * @return 返回值类：String
	 */
	public static String replaceBlank(String str) {
		String dest = "";
		if (str != null) {
			Pattern p = Pattern.compile("\\s*|\t|\r|\n");
			Matcher m = p.matcher(str);
			dest = m.replaceAll("");
		}
		return dest;
	}

	/**
	 *
	 * 对于对象中的属性做空格、tab键和回车的处理
	 *
	 * @param： 参数1：Object
	 * @return 返回值类：返回值描述
	 * @throws： 抛出的例外：抛出的例外描述
	 */
	public static Object replaceBlankObject(Object obj) {
		List list = getFiledsInfo(obj);
		Map infoMap = null;
		for (int i = 0; i < list.size(); i++) {
			infoMap = (Map) list.get(i);
			if (infoMap.get("type").equals("class java.lang.String")) {
				String str = (String) infoMap.get("value");
				String dest = "";
				if (str != null) {
					Pattern p = Pattern.compile("\\s*|\t|\r|\n");
					Matcher m = p.matcher(str);
					dest = m.replaceAll("");
				}
				try {
					Field field = obj.getClass().getDeclaredField((String) infoMap.get("name"));
					field.setAccessible(true);
					field.set(obj, dest);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
		return obj;
	}

	/**
	 * 获取属性类型(type)，属性名(name)，属性值(value)的map组成的list
	 */
	private static List getFiledsInfo(Object o) {
		Field[] fields = o.getClass().getDeclaredFields();
		String[] fieldNames = new String[fields.length];
		List list = new ArrayList();
		Map infoMap = null;
		for (int i = 0; i < fields.length; i++) {
			infoMap = new HashMap();
			if (java.lang.reflect.Modifier.isFinal(fields[i].getModifiers())) {
				continue;
			}
			infoMap.put("type", fields[i].getType().toString());
			infoMap.put("name", fields[i].getName());
			infoMap.put("value", getFieldValueByName(fields[i].getName(), o));
			list.add(infoMap);
		}
		return list;
	}

	/**
	 * 根据属性名获取属性值
	 */
	private static Object getFieldValueByName(String fieldName, Object o) {
		try {
			String firstLetter = fieldName.substring(0, 1).toUpperCase();
			String getter = "get" + firstLetter + fieldName.substring(1);
			Method method = o.getClass().getMethod(getter, new Class[] {});
			Object value = method.invoke(o, new Object[] {});
			return value;
		} catch (Exception e) {
			return null;
		}
	}



}
